"""
Case Type   : cm_install
Case Name   : cm_install不指定-e参数，om数据库为环境变量分离的模式安装
Create At   : 2025/4/16
Owner       : @ningyali
Description :
    1.配置xml文件中的cm相关参数
    2.数据库用户下执行cm_install,不指定-e参数
    3.cm_ctl查看集群状态
    4.gs_om查看集群状态
Expect      :
    1.执行成功
    2.安装成功
    3.查询成功，已安装cm
    4.已安装cm
History     :
"""
import os
import unittest

from testcase.utils.ComInstall import CmInstall
from testcase.utils.ComInstall import CmUnInstall
from testcase.utils.Common import Common
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from testcase.utils.Logger import Logger
from yat.test import Node
from yat.test import macro


class CMInstallCase(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'----{os.path.basename(__file__)} start----')
        self.common = Common()
        self.pri_sh = CommonSH('PrimaryDbUser')
        self.root_nodes = (Node('PrimaryRoot'), Node('Standby1Root'),
                           Node('Standby2Root'))
        self.user_nodes = (Node('PrimaryDbUser'), Node('Standby1DbUser'),
                           Node('Standby2DbUser'))
        self.constant = Constant()
        self.install_pkg_path = os.path.dirname(macro.DB_SCRIPT_PATH)
        self.cm = CmInstall(self.install_pkg_path, self.pri_sh.node.ssh_user)

    def test_install(self):
        text = '----step1:配置xml文件中的cm相关参数;expect:执行成功----'
        self.log.info(text)
        res = self.cm.update_xml_for_cm(*self.root_nodes)
        self.assertGreater(res.count('cmDir'), 1, f'执行失败: {text}')

        text = '----step2:数据库用户下执行cm_install,不指定-e参数;expect:安装成功----'
        self.log.info(text)
        ls_cmd = f'cd {self.cm.pkg_path};ls|grep "CM"|grep "tar.gz"'
        self.log.info(ls_cmd)
        ls_res = self.common.get_sh_result(self.user_nodes[0], ls_cmd)
        self.log.info(ls_res)

        param = f"-X {macro.DB_XML_PATH} " \
                f"--cmpkg={os.path.join(self.cm.pkg_path, ls_res.strip())}"
        install_res = self.cm.cm_install(self.user_nodes[0], param)
        self.assertIn('Install CM tool success', install_res, '执行失败:' + text)

        text = '----step3:cm_ctl查看集群状态;expect:查询成功，已安装cm----'
        self.log.info(text)
        show_status = f'source {macro.DB_ENV_PATH};' \
                      f'cm_ctl query -Civdp'
        status_msg = self.common.get_sh_result(self.user_nodes[0], show_status)
        self.assertIn("CMServer State", status_msg, "执行失败:" + text)

        text = '----step4:gs_om查看集群状态;expect:已安装cm----'
        self.log.info(text)
        status_msg = self.pri_sh.get_db_cluster_status('detail')
        self.log.info(status_msg)
        self.assertIn('CMServer State', status_msg, "执行失败:" + text)

    def tearDown(self):
        text = '----poststep1:卸载cm;expect:执行成功----'
        self.log.info(text)
        self.un_cm = CmUnInstall(self.install_pkg_path,
                                 self.pri_sh.node.ssh_user)
        res = self.un_cm.cm_uninstall(
            self.user_nodes[0], '--deleteData --deleteBinary')
        self.assertIn('Uninstall CM tool success', res, f'执行失败: {text}')
        self.log.info(f'----{os.path.basename(__file__)} end----')
